<?php
namespace Home\Controller;
use Common\Controller\HomeBaseController; 

class AlipayController extends HomeBaseController {
        //在类初始化方法中，引入相关类库    
        public function _initialize() {
        	parent::_initialize();
        	
        vendor('Alipay.Corefunction');
         vendor('Alipay.Md5function');
         vendor('Alipay.Notify');
         vendor('Alipay.Submit');    
         
         header("Content-type:text/html;charset=utf-8");
         $c=F("Config_alipay");
         
        $this->alipay_config=array(
         		'partner' =>$c["ALIPAY_PARTNER"],   //这里是你在成功申请支付宝接口后获取到的PID；
         		'key'=>trim($c["ALIPAY_KEY"]),//这里是你在成功申请支付宝接口后获取到的Key
         		'sign_type'=>strtoupper('MD5'),
         		'input_charset'=> strtolower('utf-8'),
         		'cacert'=> getcwd().'\\cacert.pem',
         		'transport'=> 'http',
         );
        
      
         
         $this->alipay   =array(
         		//这里是卖家的支付宝账号，也就是你申请接口时注册的支付宝账号
         		'seller_email'=>$c["ALIPAY_SELLER_MAIL"],
         
         		//这里是异步通知页面url，提交到项目的Pay控制器的notifyurl方法；
         		'notify_url'=> lap_get_host().U('/Home/Alipay/notifyurl'),
         
         		//这里是页面跳转通知url，提交到项目的Pay控制器的returnurl方法；
         		'return_url'=>lap_get_host().U('/Home/Alipay/returnurl'),
         
         		//支付成功跳转到的页面，我这里跳转到项目的User控制器，myorder方法，并传参payed（已支付列表）
         		'successpage'=>lap_get_host().U('User/Order/index'),
         
         		//支付失败跳转到的页面，我这里跳转到项目的User控制器，myorder方法，并传参unpay（未支付列表）
         		'errorpage'=>lap_get_host().U('User/Order/index'),
         );
         
  
     }
        public function index() {
        	print_r(  $this->alipay_config);
     	
     
     }
     
     

     
     
     //doalipay方法
        /*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
          然后进行相关处理
        */
     public function doalipay(){
             /*********************************************************
             把alipayapi.php中复制过来的如下两段代码去掉，
            第一段是引入配置项，
            第二段是引入submit.class.php这个类。
           为什么要去掉？？
            第一，配置项的内容已经在项目的Config.php文件中进行了配置，我们只需用C函数进行调用即可；
            第二，这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入；所以这里不再需要；
            *****************************************************/
        // require_once("alipay.config.php");
        // require_once("lib/alipay_submit.class.php");
        
        //这里我们通过TP的C函数把配置项参数读出，赋给$alipay_config；
       $alipay_config=$this->alipay_config;  
       

  
         /**************************请求参数**************************/
              $alipaySubmit = new \AlipaySubmit($alipay_config);
         $payment_type = "1"; //支付类型 //必填，不能修改

        $order_sn=$_REQUEST['order_sn'];
        
        if (! $order_sn) {
        	$this->error ( "参数错误" );
        }
     
        $data = D("Order")->where ( array("order_sn"=>$order_sn ))->find ();
        if (! $data) {
        	$this->error ( "参数错误" );
        }
        $title=$data[title];
        
        
        $out_trade_no =$data['order_sn'];//商户订单号 通过支付页面的表单进行传递，注意要唯一！
        $subject ="123";  //订单名称 //必填 通过支付页面的表单进行传递
        $total_fee = $data[price_sum];   //付款金额  //必填 通过支付页面的表单进行传递
        $body = $subject;  //订单描述 通过支付页面的表单进行传递
        $show_url = lap_get_host().U("User/Order/show",array("id"=>$data[order_sn]));  //商品展示地址 通过支付页面的表单进行传递
      $anti_phishing_key = $alipaySubmit->query_timestamp();//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
        $exter_invoke_ip = get_client_ip(); //客户端的IP地址 
         /************************************************************/
        
        $pay_type= $_POST[payment_method]?$_POST[payment_method]:    "directPay"    ;
     
        $parameter = array(
        		"service" => "create_direct_pay_by_user",
        		"partner" => trim($alipay_config['partner']),
        		"seller_email" => $this->alipay['seller_email'],
        		"payment_type"	=> $payment_type,
        		"notify_url"	=>$this->alipay['notify_url'],
        		"return_url"	=> $this->alipay['return_url'],
        		"out_trade_no"	=>  $out_trade_no,
        		"subject"	=> $subject,
        		"total_fee"	=> $total_fee,
        		"body"	=> $body,
        		"show_url"	=> $show_url,
        		"anti_phishing_key"	=> $anti_phishing_key,
        		"exter_invoke_ip"	=> $exter_invoke_ip,
        		"_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
        );
    
        
    //print_r($parameter);
         //建立请求

         $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
         echo $html_text;
     }
     
  
         /******************************
         服务器异步通知页面方法
        其实这里就是将notify_url.php文件中的代码复制过来进行处理
        
         *******************************/
     function notifyurl(){
                 /*
                 同理去掉以下两句代码；
                */ 
                 //require_once("alipay.config.php");
                 //require_once("lib/alipay_notify.class.php");
                 
                 //这里还是通过C函数来读取配置项，赋值给$alipay_config
         $alipay_config=$this->alipay_config;

         //计算得出通知验证结果
        $alipayNotify = new \AlipayNotify($alipay_config);
         $verify_result = $alipayNotify->verifyNotify();

         if($verify_result) {
                //验证成功
                   //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
           $out_trade_no   = $_POST['out_trade_no'];      //商户订单号
           $trade_no       = $_POST['trade_no'];          //支付宝交易号
           $trade_status   = $_POST['trade_status'];      //交易状态
           $total_fee      = $_POST['total_fee'];         //交易金额
           $notify_id      = $_POST['notify_id'];         //通知校验ID。
           $notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
           $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号；
                   $parameter = array(
              "out_trade_no"     => $out_trade_no, //商户订单编号；
             "trade_no"     => $trade_no,     //支付宝交易号；
             "total_fee"     => $total_fee,    //交易金额；
             "trade_status"     => $trade_status, //交易状态
             "notify_id"     => $notify_id,    //通知校验ID。
             "notify_time"   => $notify_time,  //通知的发送时间。
             "buyer_email"   => $buyer_email,  //买家支付宝帐号；
           );
            if($_POST['trade_status'] == 'TRADE_FINISHED') {
                        //
            }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {                       
            	
            	if(!D("Order")->checkorderstatus($out_trade_no)){
                D("Order")->jiesuan($parameter); 
                            //进行订单处理，并传送从支付宝返回的参数；
               }
             }
             $this->success("支付成功！");
                
         }else {
                 //验证失败
         	$this->error("支付失败！");
           
         }    
     }
     
     /*
         页面跳转处理方法；
        这里其实就是将return_url.php这个文件中的代码复制过来，进行处理； 
         */
     function returnurl(){
                 //头部的处理跟上面两个方法一样，这里不罗嗦了！
        $alipay_config=$this->alipay_config;
         $alipayNotify = new \AlipayNotify($alipay_config);//计算得出通知验证结果
        $verify_result = $alipayNotify->verifyReturn();
          if($verify_result) {
             //验证成功
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
        $out_trade_no   = $_GET['out_trade_no'];      //商户订单号
        $trade_no       = $_GET['trade_no'];          //支付宝交易号
        $trade_status   = $_GET['trade_status'];      //交易状态
        $total_fee      = $_GET['total_fee'];         //交易金额
        $notify_id      = $_GET['notify_id'];         //通知校验ID。
        $notify_time    = $_GET['notify_time'];       //通知的发送时间。
        $buyer_email    = $_GET['buyer_email'];       //买家支付宝帐号；
            
         $parameter = array(
             "out_trade_no"     => $out_trade_no,      //商户订单编号；
            "trade_no"     => $trade_no,          //支付宝交易号；
            "total_fee"      => $total_fee,         //交易金额；
            "trade_status"     => $trade_status,      //交易状态
            "notify_id"      => $notify_id,         //通知校验ID。
            "notify_time"    => $notify_time,       //通知的发送时间。
            "buyer_email"    => $buyer_email,       //买家支付宝帐号
        );
         
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
         if(!D("Order")->checkorderstatus($out_trade_no)){
              D("Order")->jiesuan($parameter);  //进行订单处理，并传送从支付宝返回的参数；
    }
    $this->success("支付成功！",$this->alipay['successpage']);
      //   $this->redirect($this->alipay['successpage'] );//跳转到配置项中配置的支付成功页面；
    }else {
     $this->succes("支付失败！",$this->alipay['successpage']);
         //$this->redirect($this->alipay['errorpage'] );//跳转到配置项中配置的支付失败页面；
    }
 }else {
 	
     //验证失败
    //如要调试，请看alipay_notify.php页面的verifyReturn函数
 	$this->error("支付失败！",$this->alipay['successpage']);

     }
 }
 }
 ?>